package com.neusoft.mapper;

import com.neusoft.po.Wallet;
import com.neusoft.po.WalletTransaction;

import org.apache.ibatis.annotations.*;
import java.util.List;

/**
 * 钱包数据访问层接口，用于与数据库进行交互操作。
 */
@Mapper
public interface WalletMapper {

    /**
     * 根据用户ID获取钱包信息。
     *
     * @param userId 用户ID
     * @return 钱包对象
     */
    @Select("SELECT * FROM wallet WHERE userId = #{userId}")
    Wallet getWalletByUserId(@Param("userId") String userId);

    /**
     * 更新用户的余额，增加或减少指定金额。
     *
     * @param userId 用户ID
     * @param amount 更新的金额，可以为正数（增加余额）或负数（减少余额）
     * @return 受影响的行数
     */
    @Update("UPDATE wallet SET balance = #{amount} WHERE userId = #{userId}")
    int updateBalance(@Param("userId") String userId, @Param("amount") Double amount);

    /**
     * 创建一个新的钱包记录。
     *
     * @param wallet 钱包对象
     * @return 操作是否成功
     */
    @Insert("INSERT INTO wallet (userId, balance, frozen_balance, overdraft_limit, debt_amount) VALUES (#{userId}, #{balance}, #{frozenBalance}, #{overdraftLimit}, #{debtAmount})")
    int createWallet(Wallet wallet);

     /**
     * 添加交易记录。
     *
     * @param transaction 钱包交易对象
     * @return 受影响的行数
     */
    @Insert("INSERT INTO wallet_transaction (transaction_id, userId, from_user_id, to_user_id, amount, type, date) " +
            "VALUES (#{transactionId}, #{userId}, #{fromUserId}, #{toUserId}, #{amount}, #{type}, #{date})")
    int addTransaction(WalletTransaction transaction);

    /**
     * 根据用户ID获取所有交易记录。
     *
     * @param userId 用户ID
     * @return 交易记录列表
     */
    @Select("SELECT * FROM wallet_transaction WHERE userId = #{userId} ORDER BY date DESC")
    List<WalletTransaction> getTransactionsByUserId(@Param("userId") String userId);

    /**
     * 获取最低奖励值。
     *
     * @return reward_lowest 最低奖励值
     */
    @Select("SELECT reward_lowest FROM punish_reward")
    Double getRewardLowest();

    /**
     * 获取奖励金额。
     *
     * @return reward_amount 奖励金额
     */
    @Select("SELECT reward_amount FROM punish_reward")
    Double getRewardAmount();

    /**
     * 获取处罚比率。
     *
     * @return punish_rate 处罚比率
     */
    @Select("SELECT punish_rate FROM punish_reward")
    Double getPunishRate();

    /**
     * 获取债务时间。
     *
     * @return debt_time 债务时间
     */
    @Select("SELECT debt_time FROM punish_reward")
    Integer getDebtTime();

    /**
     * 获取债务比率。
     *
     * @return debt_rate 债务比率
     */
    @Select("SELECT debt_rate FROM punish_reward")
    Double getDebtRate();

    /**
     * 获取剩余透支额度。
     *
     * @param userId 用户ID
     * @return overdraft_limit 剩余透支额度
     */
    @Select("SELECT overdraft_limit FROM wallet WHERE userId = #{userId}")
    Double getOverdraftLimit(@Param("userId") String userId);

    /**
     * 获取负债额。
     *
     * @param userId 用户ID
     * @return debt_amount 负债额
     */
    @Select("SELECT debt_amount FROM wallet WHERE userId = #{userId}")
    Double getDebtAmount(@Param("userId") String userId);

    /**
     * 更新用户的负债额。
     *
     * @param userId 用户ID
     * @param newDebtAmount 新的负债额
     * @return 操作是否成功
     */
    @Update("UPDATE wallet SET debt_amount = #{newDebtAmount} WHERE userId = #{userId}")
    int updateDebtAmount(@Param("userId") String userId, @Param("newDebtAmount") Double newDebtAmount);

    /**
     * 更新用户的透支额度。
     *
     * @param userId 用户ID
     * @param newOverdraftLimit 新的透支额度
     * @return 操作是否成功
     */
    @Update("UPDATE wallet SET overdraft_limit = #{newOverdraftLimit} WHERE userId = #{userId}")
    int updateOverdraftLimit(@Param("userId") String userId, @Param("newOverdraftLimit") Double newOverdraftLimit);

    /**
     * 获取用户的冻结资金。
     *
     * @param userId 用户ID
     * @return frozen_balance 冻结资金
     */
    @Select("SELECT frozen_balance FROM wallet WHERE userId = #{userId}")
    Double getFrozenBalance(@Param("userId") String userId);

    /**
    * 更新用户的冻结资金。
    *
    * @param userId 用户ID
    * @param amount 冻结金额变动
    * @return 操作是否成功
    */
    @Update("UPDATE wallet SET frozen_balance = frozen_balance + #{amount} WHERE userId = #{userId}")
    int updateFrozenBalance(@Param("userId") String userId, @Param("amount") Double amount);

}
